package com.lulin.common.exception;

import com.lulin.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 统一异常处理类
 *
 * @author lulin
 * @date 2022/10/12 15:07
 */
@Slf4j
//Spring 中用于定义全局异常处理器的注解，统一处理指定basePackages包下的所有Controller的异常
@RestControllerAdvice(basePackages = "com.lulin.mall.product.controller")
public class ExceptionControllerAdvice {
    /**
     * 处理验证异常的方法
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handlerValidExecption(MethodArgumentNotValidException e) {
        // 提交的数据经过JSR303校验后有非法的字段
        Map<String, String> map = new HashMap<>();
        // 获取所有非法信息
        List<FieldError> fieldErrors = e.getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            // 获取提交的不合法数据 字段
            String field = fieldError.getField();
            // 获取非法的field的提示信息
            String defaultMessage = fieldError.getDefaultMessage();
            map.put(field, defaultMessage);
        }
        return R.error(BizCodEnum.VALID_EXCEPTION.getCode(), BizCodEnum.VALID_EXCEPTION.getMsg()).put("data", map);
    }

    /**
     * 系统其他的异常处理
     */
    @ExceptionHandler(Throwable.class)
    public R handlerExecption(Throwable throwable) {
        log.error("错误信息：", throwable);
        return R.error(BizCodEnum.UNKNOW_EXCEPTION.getCode(), BizCodEnum.UNKNOW_EXCEPTION.getMsg()).put("data", throwable.getMessage());
    }

}
